#!/usr/bin/make -f
#
# \brief  Tool for preparing the Qt5 tool-chain for the Genode OS Framework
# \author Christian Prochaska
# \date   2018-01-03
#

SHELL   = bash
ECHO    = @echo -e
VERBOSE = @

help:
	$(ECHO)
	$(ECHO) "Build Qt5 tools for the Genode OS Framework tool chain"
	$(ECHO)
	$(ECHO) "--- available commands ---"
	$(ECHO) "build         - build Qt5 tools"
	$(ECHO) "install       - install Qt5 tools to '$(INSTALL_LOCATION)'"
	$(ECHO) "clean         - clean everything except contrib sources"
	$(ECHO)
	$(ECHO) "--- available command line options ---"
	$(ECHO) "MAKE_JOBS=4 - number of parallel make jobs (default: 4)"
	$(ECHO)

.PHONY: build help install

#
# Enable parallel build for 2nd-level $(MAKE) by default
#

MAKE_JOBS ?= 4

#
# Source, build and install location
#

GENODE_DIR               ?= $(realpath $(dir $(firstword $(MAKEFILE_LIST)))/..)
CONTRIB_DIR               = $(shell $(GENODE_DIR)/tool/ports/current qt5-host)
QTBASE_DIR                = $(CONTRIB_DIR)/src/lib/qtbase
QTDECLARATIVE_DIR         = $(CONTRIB_DIR)/src/lib/qtdeclarative
QTTOOLS_DIR               = $(CONTRIB_DIR)/src/lib/qttools
TOOL_VERSION              = 25.05
BUILD_DIR                 = $(GENODE_DIR)/build/tool/qt5/$(TOOL_VERSION)
DEFAULT_INSTALL_LOCATION  = /usr/local/genode/tool/$(TOOL_VERSION)
INSTALL_LOCATION         ?= $(DEFAULT_INSTALL_LOCATION)
SUDO                     ?= sudo

$(QTBASE_DIR)/configure:
	$(VERBOSE)$(GENODE_DIR)/tool/ports/prepare_port qt5-host

QMAKE = $(BUILD_DIR)/qtbase/bin/qmake

# the '-no-strip' option is needed for installing syncqt.pl

$(QMAKE): $(QTBASE_DIR)/configure
	$(VERBOSE)mkdir -p $(BUILD_DIR)/qtbase
	$(VERBOSE)cd $(BUILD_DIR)/qtbase && $(QTBASE_DIR)/configure \
	                                    -opensource \
	                                    -confirm-license \
	                                    -no-glib \
	                                    -no-iconv \
	                                    -no-icu \
	                                    -no-opengl \
	                                    -no-strip \
	                                    -no-zstd \
	                                    -qt-pcre \
	                                    -prefix $(INSTALL_LOCATION)

$(BUILD_DIR)/qtbase/src/Makefile: $(QMAKE)
	$(VERBOSE)cd $(BUILD_DIR)/qtbase/src && \
	          $(QMAKE) -o Makefile \
	          $(QTBASE_DIR)/src/src.pro -qtconf $(BUILD_DIR)/qtbase/bin/qt.conf -- -opensource

$(BUILD_DIR)/qtbase/bin/moc: $(BUILD_DIR)/qtbase/src/Makefile
	$(VERBOSE)make -C $(BUILD_DIR)/qtbase/src -j$(MAKE_JOBS) sub-moc

$(BUILD_DIR)/qtbase/bin/rcc: $(BUILD_DIR)/qtbase/src/Makefile
	$(VERBOSE)make -C $(BUILD_DIR)/qtbase/src -j$(MAKE_JOBS) sub-rcc

$(BUILD_DIR)/qtbase/bin/uic: $(BUILD_DIR)/qtbase/src/Makefile
	$(VERBOSE)make -C $(BUILD_DIR)/qtbase/src -j$(MAKE_JOBS) sub-uic

$(BUILD_DIR)/qtbase/bin/qlalr: $(BUILD_DIR)/qtbase/src/Makefile
	$(VERBOSE)make -C $(BUILD_DIR)/qtbase/src -j$(MAKE_JOBS) sub-qlalr

$(BUILD_DIR)/qtbase/lib/libQt5Xml.so.5: $(BUILD_DIR)/qtbase/src/Makefile
	$(VERBOSE)make -C $(BUILD_DIR)/qtbase/src -j$(MAKE_JOBS) sub-xml

$(BUILD_DIR)/qtdeclarative/src/qmltyperegistrar/Makefile: $(QTDECLARATIVE_DIR)/src/qmltyperegistrar/qmltyperegistrar.pro
	$(VERBOSE)mkdir -p $(dir $@)
	$(VERBOSE)cd $(dir $@) && $(BUILD_DIR)/qtbase/bin/qmake $<

$(BUILD_DIR)/qtdeclarative/bin/qmltyperegistrar: $(BUILD_DIR)/qtdeclarative/src/qmltyperegistrar/Makefile
	$(VERBOSE)make -C $(dir $<) -j$(MAKE_JOBS)

$(BUILD_DIR)/qttools/Makefile: $(QTTOOLS_DIR)/qttools.pro $(BUILD_DIR)/qtbase/lib/libQt5Xml.so.5
	$(VERBOSE)mkdir -p $(dir $@)
	$(VERBOSE)cd $(dir $@) && $(BUILD_DIR)/qtbase/bin/qmake $<

$(BUILD_DIR)/qttools/src/linguist/lupdate/Makefile: $(QTTOOLS_DIR)/src/linguist/lupdate/lupdate.pro \
                                                    $(BUILD_DIR)/qttools/Makefile
	$(VERBOSE)mkdir -p $(dir $@)
	$(VERBOSE)cd $(dir $@) && $(BUILD_DIR)/qtbase/bin/qmake $<

$(BUILD_DIR)/qttools/bin/lupdate: $(BUILD_DIR)/qttools/src/linguist/lupdate/Makefile
	$(VERBOSE)make -C $(dir $<) -j$(MAKE_JOBS)

$(BUILD_DIR)/qttools/src/linguist/lrelease/Makefile: $(QTTOOLS_DIR)/src/linguist/lrelease/lrelease.pro \
                                                     $(BUILD_DIR)/qttools/Makefile
	$(VERBOSE)mkdir -p $(dir $@)
	$(VERBOSE)cd $(dir $@) && $(BUILD_DIR)/qtbase/bin/qmake $<

$(BUILD_DIR)/qttools/bin/lrelease: $(BUILD_DIR)/qttools/src/linguist/lrelease/Makefile
	$(VERBOSE)make -C $(dir $<) -j$(MAKE_JOBS)

build: $(BUILD_DIR)/qtbase/bin/moc \
       $(BUILD_DIR)/qtbase/bin/rcc \
       $(BUILD_DIR)/qtbase/bin/uic \
       $(BUILD_DIR)/qtbase/bin/qlalr \
       $(BUILD_DIR)/qtdeclarative/bin/qmltyperegistrar \
       $(BUILD_DIR)/qttools/bin/lupdate \
       $(BUILD_DIR)/qttools/bin/lrelease

$(INSTALL_LOCATION)/bin:
	$(VERBOSE)$(SUDO) mkdir -p $@

$(INSTALL_LOCATION)/lib:
	$(VERBOSE)$(SUDO) mkdir -p $@

$(INSTALL_LOCATION)/lib/libQt5Core.so.5: $(BUILD_DIR)/qtbase/lib/libQt5Core.so.5 $(INSTALL_LOCATION)/lib
	$(VERBOSE)$(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/lib/libQt5Xml.so.5: $(BUILD_DIR)/qtbase/lib/libQt5Xml.so.5
	$(VERBOSE)$(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/moc: $(BUILD_DIR)/qtbase/bin/moc $(INSTALL_LOCATION)/bin
	$(VERBOSE)cd $(BUILD_DIR)/qtbase/src && \
              $(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/rcc: $(BUILD_DIR)/qtbase/bin/rcc $(INSTALL_LOCATION)/bin
	$(VERBOSE)cd $(BUILD_DIR)/qtbase/src && \
              $(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/uic: $(BUILD_DIR)/qtbase/bin/uic $(INSTALL_LOCATION)/bin $(INSTALL_LOCATION)/lib/libQt5Core.so.5
	$(VERBOSE)cd $(BUILD_DIR)/qtbase/src && \
              $(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/qlalr: $(BUILD_DIR)/qtbase/bin/qlalr $(INSTALL_LOCATION)/bin $(INSTALL_LOCATION)/lib/libQt5Core.so.5
	$(VERBOSE)cd $(BUILD_DIR)/qtbase/src && \
              $(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/qmltyperegistrar: $(BUILD_DIR)/qtdeclarative/bin/qmltyperegistrar $(INSTALL_LOCATION)/bin
	$(VERBOSE)cd $(BUILD_DIR)/qtdeclarative/src && \
              $(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/qmake: $(BUILD_DIR)/qtbase/bin/qmake $(INSTALL_LOCATION)/bin
	$(VERBOSE)$(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/syncqt.pl: $(INSTALL_LOCATION)/bin
	$(VERBOSE)$(SUDO) make -C $(BUILD_DIR)/qtbase install_syncqt

$(INSTALL_LOCATION)/bin/lupdate: $(BUILD_DIR)/qttools/bin/lupdate $(INSTALL_LOCATION)/bin $(INSTALL_LOCATION)/lib/libQt5Core.so.5 $(INSTALL_LOCATION)/lib/libQt5Xml.so.5
	$(VERBOSE)$(SUDO) strip $< -o $@

$(INSTALL_LOCATION)/bin/lrelease: $(BUILD_DIR)/qttools/bin/lrelease $(INSTALL_LOCATION)/bin $(INSTALL_LOCATION)/lib/libQt5Core.so.5 $(INSTALL_LOCATION)/lib/libQt5Xml.so.5
	$(VERBOSE)$(SUDO) strip $< -o $@

install: $(INSTALL_LOCATION)/bin/moc \
         $(INSTALL_LOCATION)/bin/rcc \
         $(INSTALL_LOCATION)/bin/uic \
         $(INSTALL_LOCATION)/bin/qlalr \
         $(INSTALL_LOCATION)/bin/qmake \
         $(INSTALL_LOCATION)/bin/syncqt.pl \
         $(INSTALL_LOCATION)/bin/qmltyperegistrar \
         $(INSTALL_LOCATION)/bin/lupdate \
         $(INSTALL_LOCATION)/bin/lrelease
ifeq ($(INSTALL_LOCATION),$(DEFAULT_INSTALL_LOCATION))
	$(VERBOSE)$(SUDO) ln -snf $(TOOL_VERSION) $(dir $(INSTALL_LOCATION))/current
endif

clean:
	rm -rf $(BUILD_DIR)
